package com.zjun.mybatis.generation.internal;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.dom.java.CompilationUnit;
import org.mybatis.generator.api.dom.java.Field;
import org.mybatis.generator.api.dom.java.InnerClass;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.internal.DefaultCommentGenerator;

public class MyCommentGenerator extends DefaultCommentGenerator {
	
	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	/**
	 * java文件注释
	 */
	@Override
	public void addJavaFileComment(CompilationUnit compilationUnit) {
		
	}

	/**
	 * 字段的注释信息
	 *
	 * @param field
	 * @param introspectedTable
	 * @param introspectedColumn
	 */
	@Override
	public void addFieldComment(Field field, IntrospectedTable introspectedTable,
			IntrospectedColumn introspectedColumn) {
		if (introspectedColumn.getRemarks() != null && !introspectedColumn.getRemarks().equals("")) {
			StringBuffer sb = new StringBuffer("/** ");
			sb.append(introspectedColumn.getRemarks());
			sb.append("[");
			sb.append(introspectedTable.getFullyQualifiedTableNameAtRuntime());
			sb.append(".");
			sb.append(introspectedColumn.getActualColumnName());
			sb.append("]");
			sb.append(" */");
			field.addJavaDocLine(sb.toString());
		}
	}

	/**
	 * XML文件注释
	 * 
	 * @param xmlElement
	 */
	@Override
	public void addComment(XmlElement xmlElement) {
	}

	 /**
	 * 类注释
	 * @param innerClass
	 * @param introspectedTable
	 */
	@Override
	public void addClassComment(InnerClass innerClass, IntrospectedTable introspectedTable) {
		innerClass.addJavaDocLine("/**");
		innerClass.addJavaDocLine(" * " + introspectedTable.getRemarks());
		innerClass.addJavaDocLine(" @author zhouJ (zhoujunkjf456@vip.qq.com)");
		innerClass.addJavaDocLine(" @date  "+sdf.format(new Date()));
		innerClass.addJavaDocLine(" */");
	}

	@Override
	public void addGetterComment(Method method, IntrospectedTable introspectedTable,
			IntrospectedColumn introspectedColumn) {
		StringBuilder sb = new StringBuilder();
		sb.append("/** 获取 ");
		sb.append(introspectedColumn.getRemarks());
		sb.append("【");
		sb.append(introspectedTable.getFullyQualifiedTableNameAtRuntime());
		sb.append(".");
		sb.append(introspectedColumn.getActualColumnName());
		sb.append("】 */");
		method.addJavaDocLine(sb.toString());
	}

	@Override
	public void addSetterComment(Method method, IntrospectedTable introspectedTable,
			IntrospectedColumn introspectedColumn) {
		
		StringBuilder sb = new StringBuilder();
		sb.append("/** 设置 ");
		sb.append(introspectedColumn.getRemarks());
		sb.append("【");
		sb.append(introspectedTable.getFullyQualifiedTableNameAtRuntime());
		sb.append(".");
		sb.append(introspectedColumn.getActualColumnName());
		sb.append("】 */");
		method.addJavaDocLine(sb.toString());
	}

	@Override
	public void addGeneralMethodComment(Method method, IntrospectedTable introspectedTable) {
		    StringBuilder sb = new StringBuilder();

		    sb.append(" * ");

		    String name = method.getName();
		    if (name.equals("setOrderByClause")) {
		      sb.append("排序字段");
		    } else if (name.equals("setDistinct")) {
		      sb.append("设置去重复");
		    } else if (name.equals("createCriteria")) {
		      sb.append("条件查询要先创建Criteria");
		    } else if (name.equals("countByExample")) {
		      sb.append("条件统计\r\n");
		      sb.append("     * 参数:查询条件,null为整张表\r\n");
		      sb.append("     * 返回:查询个数");
		    } else if (name.equals("deleteByExample")) {
		      sb.append("批量条件删除\r\n");
		      sb.append("     * 参数:删除条件,null为整张表\r\n");
		      sb.append("     * 返回:删除个数");
		    } else if (name.equals("deleteByPrimaryKey")) {
		      sb.append("根据主键删除\r\n");
		      sb.append("     * 参数:主键\r\n");
		      sb.append("     * 返回:删除个数");
		    } else if (name.equals("insert")) {
		      sb.append("插入，空属性也会插入\r\n");
		      sb.append("     * 参数:pojo对象\r\n");
		      sb.append("     * 返回:删除个数");
		    } else if (name.equals("insertSelective")) {
		      sb.append("插入，空属性不会插入\r\n");
		      sb.append("     * 参数:pojo对象\r\n");
		      sb.append("     * 返回:删除个数");
		    } else if (name.equals("selectByExample")) {
		      sb.append("批量条件查询\r\n");
		      sb.append("     * 参数:查询条件,null查整张表\r\n");
		      sb.append("     * 返回:对象集合");
		    } else if (name.equals("selectByPrimaryKey")) {
		      sb.append("根据主键查询\r\n");
		      sb.append("     * 参数:查询条件,主键值\r\n");
		      sb.append("     * 返回:对象");
		    } else if (name.equals("updateByExampleSelective")) {
		      sb.append("批量条件修改，空值条件不修改\r\n");
		      sb.append("     * 参数:1.要修改成的值，2.要修改条件\r\n");
		      sb.append("     * 返回:成功修改个数");
		    } else if (name.equals("updateByExample")) {
		      sb.append("批量条件修改，空值条件会修改成null\r\n");
		      sb.append("     * 参数:1.要修改成的值，2.要修改条件\r\n");
		      sb.append("     * 返回:成功修改个数");
		    } else if (name.equals("updateByPrimaryKeySelective")) {
		      sb.append("根据主键修改，空值条件不会修改成null\r\n");
		      sb.append("     * 参数:1.要修改成的值\r\n");
		      sb.append("     * 返回:成功修改个数");
		    } else if (name.equals("updateByPrimaryKey")) {
		      sb.append("根据主键修改，空值条件会修改成null\r\n");
		      sb.append("     * 参数:1.要修改成的值\r\n");
		      sb.append("     * 返回:成功修改个数");
		    } else if (name.equals("selectByExampleAndPage")) {
		      sb.append("物理分页条件查询\r\n");
		      sb.append("     * 参数:1.查询条件 2.分页条件 new RowBounds(2,3) \r\n");
		      sb.append("            从第2条开始显示，显示3条(从0开始编号)\r\n");
		      sb.append("     * 返回:成功修改个数");
		    } else if (name.equals("selectByExampleWithBLOBs")) {
		      sb.append("批量条件查询,支持大字段类型\r\n");
		      sb.append("     * 参数:查询条件,null查整张表\r\n");
		      sb.append("     * 返回:对象集合");
		    }
		    else if (name.equals("selectByExampleWithBLOBs")) {
		      sb.append("批量条件查询,支持大字段类型\r\n");
		      sb.append("     * 参数:查询条件,null查整张表\r\n");
		      sb.append("     * 返回:对象集合");
		    }
		    else if (name.equals("updateByExampleWithBLOBs")) {
		      sb.append("批量条件修改，空值条件会修改成null,支持大字段类型\r\n");
		      sb.append("     * 参数:1.要修改成的值，2.要修改条件\r\n");
		      sb.append("     * 返回:成功修改个数");
		    }
		    else if (name.equals("updateByPrimaryKeyWithBLOBs")) {
		      sb.append("根据主键修改，空值条件会修改成null,支持大字段类型\r\n");
		      sb.append("     * 参数:1.要修改成的值\r\n");
		      sb.append("     * 返回:成功修改个数");
		    }
		    else if (name.equals("selectByExampleWithBLOBsAndPage")) {
		      sb.append("物理分页条件查询,支持大字段\r\n");
		      sb.append("     * 参数:1.查询条件 2.分页条件 new RowBounds(2,3) \r\n");
		      sb.append("            从第2条开始显示，显示3条(从0开始编号)\r\n");
		      sb.append("     * 返回:成功修改个数");
		    }

		    if (sb.length() == 3)
		      return;
		    method.addJavaDocLine("/**");
		    method.addJavaDocLine(sb.toString());

//		    addJavadocTag(method, true);

		    method.addJavaDocLine(" */");
	}
}
